import "@/utils/nim-sdk/NIM_Web_NIM_v6.1.0"
import "@/utils/nim-sdk/NIM_Web_SDK_v6.1.0";
import "@/utils/nim-sdk/NIM_Web_Chatroom_v6.1.0";
import {
	Toast
} from "mint-ui";
var data = {};
var callbacks = [];
var roomCallQueue = [];
var sync = false;
var nim, chatroom;
var anonymous = localStorage.nim_anonymous_account || null;

function im_ini() {
	var userInfo2 = JSON.parse(localStorage.userInfo2);
	if (!userInfo2) {
		return;
	}
	var account = userInfo2.yx_user.yx_accid;
	var token = userInfo2.yx_user.yx_token;
	if (nim) {
		if (account !== localStorage.getItem('im-account')) {
			data.connect && nim.disconnect();
			data = {};
		} else {
			return;
		}
	}
	if (!account && !token) { //提示没有账号错误
		//错误处理
		return;
	}
	console.info(account, token);
	// 注意这里, 引入的 SDK 文件不一样的话, 你可能需要使用 SDK.NIM.getInstance 来调用接口
	//测试 45c6af3c98409b18a84451215d0bdd6e a123456 e10adc3949ba59abbe56e057f20f883e
	//生产 ffa917c9f0409333abd0cbc2dc197df1
	// account = 'a123456';
	// token = 'e10adc3949ba59abbe56e057f20f883e';
	nim = SDK.NIM.getInstance({
		// debug: true,
		appKey: 'ffa917c9f0409333abd0cbc2dc197df1',
		account: account,
		token: token,
		// privateConf: {}, // 私有化部署方案所需的配置
		onconnect: onConnect,
		onwillreconnect: onWillReconnect,
		ondisconnect: onDisconnect,
		onerror: onError,
		onsyncdone: onSyncDone,
		onfriends: onfriends,
		onusers: onusers,
		onteams: onteams,
		onroamingmsgs: onroamingmsgs,
		onofflinemsgs: onofflinemsgs,
		onmsg: onmsg
	});

	function onConnect(_data) {
		localStorage.setItem('im-account', account);
		localStorage.setItem('im-token', token);
		data.connect = _data;
		console.log('连接成功');
	}

	function onWillReconnect(obj) {
		// 此时说明 SDK 已经断开连接, 请开发者在界面上提示用户连接已断开, 而且正在重新建立连接
		console.log('即将重连');
		console.log(obj.retryCount);
		console.log(obj.duration);
	}

	function onDisconnect(error) {
		// 此时说明 SDK 处于断开状态, 开发者此时应该根据错误码提示相应的错误信息, 并且跳转到登录页面
		console.log('丢失连接');
		console.log(error);
		if (error) {
			switch (error.code) {
				// 账号或者密码错误, 请跳转到登录页面并提示错误
				case 302:
					break;
					// 重复登录, 已经在其它端登录了, 请跳转到登录页面并提示错误
				case 417:
					break;
					// 被踢, 请提示错误后跳转到登录页面
				case 'kicked':
					break;
				default:
					break;
			}
		}
	}

	function onError(error) {
		console.log(error);
	}

	function onSyncDone() { //同步完成处理
		sync = true;
		var callback;
		while (callback = callbacks.shift()) {
			callback(data);
		}
		console.log('同步完成');
	}

	function onfriends(_data) { //同步好友
		data.friends = _data;
	}

	function onusers(_data) { //同步好友对应的用户名片列表
		data.users = _data;
	}

	function onteams(_data) { //同步群列表
		data.teams = _data;
	}

	function onroamingmsgs(_data) { //同步漫游消息
		pushMsg(_data.msgs);
	}

	function onofflinemsgs(_data) { //收到离线消息
		pushMsg(_data.msgs);
	}

	function onmsg(_data) { //收消息
		pushMsg(_data);
		switch (_data.type) {
			case 'custom':
				// onCustomMsg(_data);
				break;
			case 'notification':
				// 处理群通知消息
				// onTeamNotificationMsg(_data);
				break;
				// 其它case
			default:
				break;
		}
	}
};
//获取同步数据
export function getIMData(callback) {
	if (!nim) {
		im_ini();
	}
	if (sync) {
		callback(data);
	} else {
		callbacks.push(callback);
	}
};
//合并消息，用于切换聊天加载聊天记录
function pushMsg(msgs) {
	if (!Array.isArray(msgs)) {
		msgs = [msgs];
	}
	var sessionId = msgs[0].scene + '-' + msgs[0].account;
	data.msgs = data.msgs || {};
	data.msgs[sessionId] = nim.mergeMsgs(data.msgs[sessionId], msgs);
}
/**
 * 获取消息
 * @param {*} scene 场景
 * @param {*} account 账号或群ID
 * @param {*} callback 获取消息回调
 */
export function getMsgs(scene, account, callback) {
	getIMData(function(data) {
		var sessionId = scene + '-' + account;
		callback(data.msgs ? data.msgs[sessionId] || [] : []);
	});
}

//发消息
export function send(scene, account, msg, type = 'text', callback = null) {
	if (!nim) {
		im_ini();
		getIMData(function() {
			send(scene, account, msg, type, callback);
		});
		return;
	}
	if (scene === 'room') {
		callChatroom(account, () => {
			/**
			 type来标明消息的类型, 具体类型如下:
			  'text' (文本消息)
			  'image' (图片消息)
			  'audio' (音频消息)
			  'video' (视频消息)
			  'file' (文件消息)
			  'geo' (地理位置消息)
			  'custom' (自定义消息)
			  'tip' (提醒消息)
			  提醒消息用于会话内的状态提醒，如进入会话时出现的欢迎消息，或者会话命中敏感词后的提示消息等等.
			  'robot' (AI机器人消息)
			  'notification' (群通知消息)
			 */
			switch (type) {
				case 'text':
					chatroom.sendText({
						text: msg,
						done: function(error, _chatroom, msg) {
							callback && callback(error, msg);
						}
					});
					break;
			}
		});
	} else {
		/*
		 scene来标明消息所属的场景:
		'p2p' (点对点消息)
		'team' (群消息)
		*/
		/**
		 type来标明消息的类型, 具体类型如下:
		  'text' (文本消息)
		  'image' (图片消息)
		  'audio' (音频消息)
		  'video' (视频消息)
		  'file' (文件消息)
		  'geo' (地理位置消息)
		  'custom' (自定义消息)
		  'tip' (提醒消息)
		  提醒消息用于会话内的状态提醒，如进入会话时出现的欢迎消息，或者会话命中敏感词后的提示消息等等.
		  'robot' (AI机器人消息)
		  'notification' (群通知消息)
		 */
		switch (type) {
			case 'text':
				var msg = nim.sendText({
					scene: scene,
					to: account,
					text: msg,
					done: function(error, msg) {
						callback && callback(error, msg);
						if (!error) {
							pushMsg(msg);
						}
					}
				});
				break;
		}
	}
};


//初始化聊天室
function initChatroom(chatroomId) {
	if (chatroom) {
		if (chatroom.options.chatroomId == chatroomId) {
			// 连接成功后才可以发消息
			var callback;
			while (callback = roomCallQueue.shift()) {
				callback();
			}
			return;
		} else {
			chatroom.disconnect();
		}
	}
	nim.getChatroomAddress({
		chatroomId: chatroomId,
		done: (error, obj) => {
			if (error) {
				Toast({
					message: error.message,
					duration: 2000
				});
			} else {
				var userInfo2 = localStorage.userInfo2 ? JSON.parse(localStorage.userInfo2) : null;
				var config = {
					appKey: 'ffa917c9f0409333abd0cbc2dc197df1',
					chatroomId: chatroomId,
					chatroomAddresses: obj.chatroomAddresses,
					onconnect: onChatroomConnect,
					onerror: onChatroomError,
					onwillreconnect: onChatroomWillReconnect,
					ondisconnect: onChatroomDisconnect,
					// 消息
					onmsgs: onChatroomMsgs,
					chatroomAddresses: obj.address
				};
				if (userInfo2) {
					config.account = userInfo2.yx_user.yx_accid;
					config.token = userInfo2.yx_user.yx_token;
				} else {
					if (anonymous && anonymous.account) {
						config.account = anonymous.account;
					} else {
						anonymous = {};
					}
					config.isAnonymous = true;
				}
				chatroom = Chatroom.getInstance(config);
			}
		}
	});
}

function onChatroomConnect(obj) {
	console.log('进入聊天室', obj);
	if (anonymous) {
		anonymous.account = obj.account;
		localStorage.nim_anonymous_account = anonymous.account;
	}
	// 连接成功后才可以发消息
	var callback;
	while (callback = roomCallQueue.shift()) {
		callback();
	}
}

function onChatroomWillReconnect(obj) {
	// 此时说明 `SDK` 已经断开连接, 请开发者在界面上提示用户连接已断开, 而且正在重新建立连接
	console.log('即将重连', obj);
}

function onChatroomDisconnect(error) {
	// 此时说明 `SDK` 处于断开状态, 开发者此时应该根据错误码提示相应的错误信息, 并且跳转到登录页面
	console.log('连接断开', error);
	chatroom = null;
	if (error) {
		switch (error.code) {
			// 账号或者密码错误, 请跳转到登录页面并提示错误
			case 302:
				break;
				// 被踢, 请提示错误后跳转到登录页面
			case 'kicked':
				break;
			default:
				break;
		}
	}
}

function onChatroomError(error, obj) {
	console.log('发生错误', error, obj);
}

function onChatroomMsgs(msgs) {
	console.log('收到聊天室消息', msgs);
	if (onChatroomMsgs.callback) {
		onChatroomMsgs.callback(msgs);
	}
}

// 聊天室调用
function callChatroom(roomid, callback) {
	getIMData(function() {
		roomCallQueue.push(callback);
		initChatroom(roomid);
	});
}

// 聊天室消息推送
export function pushRoomMsg(chatroomId, callback) {
	callChatroom(chatroomId, () => {
		onChatroomMsgs.callback = callback;
	});
}

// 获取聊天室用户信息
export function getChatroomUser(roomid, chatroomIds, callback) {
	callChatroom(roomid, () => {
		chatroom.getChatroomMembersInfo({
			accounts: chatroomIds,
			done: callback
		});
	});
}
//退出聊天室
export function exitChatroom() {
	if (chatroom) {
		chatroom.disconnect();
		chatroom = null;
	}
}
